package cn.demo.io.demo3.training;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端应用程序
 *
 * @author admin
 */
public class Client {
    /**
     * 客户端Socket
     */
    private Socket socket;

    public Client() {
        try {
            /*
			 * 构造方法:Socket(String host,int port)
			 * 参数1:服务端的IP地址
			 * 参数2:服务端申请的服务端口
			 *
			 * 创建客户端Socket实例的过程也是链接服务端
			 * 的过程。在new的同时就尝试链接服务端了
			 *
			 * 若链接自己的机器常用:
			 * localhost
			 * 127.0.0.1
			 */
            socket = new Socket("localhost", 8088);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端开始工作的方法
     */
    public void start() {
        try {
            Runnable handler = new GetServerMessageHandler();
            Thread t = new Thread(handler);
			/*
			 * 读取服务端发送过来数据的这个线程设置为了
			 * 后台线程，这样当我们想与服务器断开连接
			 * 结束程序时，只需要将向服务器发送信息的线程
			 * 结束即可。这样该线程也会跟着结束了。
			 *
			 */
            t.setDaemon(true);
            t.start();

            //java.io.OutputStream
            OutputStream out = socket.getOutputStream();
            //包装为字符流，并指定字符集
            OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
            //包装为缓冲字符输出流
            PrintWriter writer = new PrintWriter(osw, true);

			/*
			 * 创建Scanner用于读取键盘输入的内容
			 */
            Scanner scanner = new Scanner(System.in);
            //用于保存用户输入的每一行字符串
            String message = null;
            while (true) {
                message = scanner.nextLine();
                writer.println(message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 该任务用于并发执行，循环读取服务端发送过来的数据
     *
     * @author admin
     */
    private class GetServerMessageHandler implements Runnable {
        public void run() {

			/*
			 * 通过Socket获取输入流，将其包装为缓冲字符
			 * 输入流，循环读取服务端发送过来的信息，并
			 * 输出到控制台即可
			 */
            try {
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in, "UTF-8");
                BufferedReader reader = new BufferedReader(isr);

                String message = null;
                while ((message = reader.readLine()) != null) {
					/*
					 * 读取到服务端发送过来的信息后输出到
					 * 客户端的控制台上
					 */
                    System.out.println(message);
                }

            } catch (Exception e) {

            }
        }
    }


    public static void main(String[] args) {
        //实例化客户端
        Client client = new Client();
        client.start();
    }
}